#ifndef ___fuse_rename
#define ___fuse_rename 1

#ifndef FUSE_USE_VERSION
#define FUSE_USE_VERSION 28
#endif

#include <stdio.h>
#include <stdlib.h>
#include "mtlib.c"
#include <fuse.h>
#include <fcntl.h>
#include <errno.h>
#include "logging.c"

struct datosRenombrar {
    char * pathA;
    char * pathB;
    char estado;
};

//Prototipos
int fuse_rename(const char *, const char *);
void ___fuse_procesar_mensaje_rename(unsigned char, mti_mensaje, struct datosRenombrar *);

//RENOMBRAR O MOVER ARCHIVO
int fuse_rename(const char * pathViejo,const char * pathNuevo) {

    mti_mensaje datosMensaje;
    int resultado;
    unsigned char centro_rename = 0;
    unsigned int descriptorConexion;
    struct datosRenombrar datos;

        datos.estado = 0;
        datos.pathA = pathViejo;
        datos.pathB = pathNuevo;

        while (!centro_rename)
              centro_rename = mtf_obtener_descriptor(1024);

        descriptorConexion = mtf_conectar(centro_rename, MTP_INTERNO, centro_fat);

        if (descriptorConexion == 0) {
            mtf_liberar_descriptor(centro_rename);
            return -EAGAIN;
        }

        resultado = mtf_enviar_mensaje(centro_rename, descriptorConexion, MTE_RENOMBRAR_ARCHIVO, (char *) datos.pathA,(char *) datos.pathB);
        //le envio un mensaje al centro del sistema fat para renombrar un archivo pasandole el nombre actual y el nombre
        //con el que lo quiero renombrar

        if (resultado == 0) {
            mtf_desconectar(centro_rename, descriptorConexion);
            mtf_liberar_descriptor(centro_rename);
            return -EAGAIN;
          }

        while (!datos.estado) {

            if (!mtf_recibir_mensajes(centro_rename)) continue;

            datosMensaje = mtf_siguiente_mensaje(centro_rename);
            ___fuse_procesar_mensaje_rename(centro_rename, datosMensaje, &datos);
            mtf_descartar_mensaje(centro_rename, datosMensaje.codigo);

        }

        mtf_desconectar(centro_rename, descriptorConexion); //desconecto la conexion del centro de mensajes
        mtf_liberar_descriptor(centro_rename); //libero centro de mensajes con sus datos y conexiones

          switch (datos.estado) {
            case 1:
                return -ENOENT; //path viejo no existe
            case 2:
                return -EEXIST; //path nuevo ya existe
            case 3:
                return -EACCES; //disco lleno
            case 4:
                return -ENOENT; //el path no existe
            default:
                return EXIT_SUCCESS;
          }
}

void ___fuse_procesar_mensaje_rename(unsigned char centro_rename, mti_mensaje datosMensaje, struct datosRenombrar * datosRenombrados) {

    if (datosMensaje.categoria != MTA_MENSAJE) return;

      switch (datosMensaje.tipo) {

        case MTE_NULL:

          mtf_enviar_mensaje(centro_rename, datosMensaje.remitente, MTR_NULL);

        break;

        case MTR_NULL: case MTQ_MENSAJE_NO_VALIDO:

        break;

        //MENSAJES PARA RENOMBRAR ARCHIVO
        case MTR_ARCHIVO_RENOMBRO:
        {
            char * nombreNuevo = NULL;

                mtf_obtener_datos(centro_rename, datosMensaje.codigo,(char **) &nombreNuevo);

                log_registrar(descArch, "FUSE", LOG_INFO, "Archivo renombrado o movido %s \n", nombreNuevo);
                free(nombreNuevo);
        }
        break;

        case MTR_ARCHIVO_NO_RENOMBRO:
        {
            char * nombreArchivo = NULL;
            char motivo;

                mtf_obtener_datos(centro_rename,datosMensaje.codigo,(char **) &nombreArchivo, (char *) &motivo);

                datosRenombrados -> estado = motivo;
                log_registrar(descArch, "FUSE", LOG_WARN, "No se pudo renombrar %s \n", nombreArchivo);
                free(nombreArchivo);
        }
        break;

        default:

              mtf_enviar_mensaje(centro_rename, datosMensaje.remitente, MTQ_MENSAJE_NO_VALIDO);

        break;
      }
}

#endif

